"""

Define la clase pieces y sus clases hijas

"""
class Piece():
	"""Clase madre de todas las piezas."""	
	def __init__(self,position,name):
		"""Asigna la posicion inicial.
		posicion=(fila,columna) Ejemplo: (7,a) = (1,0)
		Y nombre (K,Q,B,R,N,P)		
		"""
		self.position=position
		self.name=name
		self.moves=self.move()

	def move(self):
		"""Devuelve una lista con los movimientos de cada pieza"""
		abstract
	
	def posible_cells(self):
		"""Devuelve una lista con las celdas hacia las que puede ir.
		No tiene en cuenta a ningun otra pieza"""
		cells=[]
		p=list(self.position)
		for m in self.move():
			if ((p[0]+m[0]<8) and (p[0]+m[0]>-1) and (p[1]+m[1]<8) and (p[1]+m[1]>-1)):
				cells.append((p[0]+m[0],p[1]+m[1]))
					
		return cells				


class King(Piece):
	def move(self):
		"""El rey mueve de a un casillero en cualquier direccion"""
		m=[(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1),(-1,0),(-1,1)]
		return m
		
class Queen(Piece):
	
	def move(self):
		"""La reina mueve n (1 a 7) casilleros de en cualquier direccion """
		m=[]		
		for x in range(1,8):
			"Movimientos por columna"
			m.append((0,x))
			m.append((0,-x))

			"Movimientos por fila"
			m.append((x,0))
			m.append((-x,0))

			"Movimientos diagonales"
			m.append((x,x))
			m.append((x,-x))
			m.append((-x,x))
			m.append((-x,-x))
		return m


class Bishop(Piece):
	def move(self):
		"""El alfil mueve por las diagonales."""
		m=[]
		for x in range(1,8):
			m.append((x,x))
			m.append((x,-x))
			m.append((-x,x))
			m.append((-x,-x))
		return m

class Rock(Piece):
	def move(self):
		"""La torre mueve n casilleros de forma vertical u horizontal"""
		m=[]
		for x in range(1,8):
			m.append((0,x))
			m.append((0,-x))
			m.append((x,0))
			m.append((-x,0))
		return m

class Knight(Piece):
	def move(self):
		"""El caballo mueve en forma de L, dos casilleros hacia una direccion
		y uno hacia otra en forma perpendicular"""
		m=[(1,2),(2,1),(2,-1),(1,-2),(-1,-2),(-2,-1),(-2,1),(-1,2) ]
		return m		

class Pawn(Piece):
	def move(self):
		"""El peon mueve de a un casillero, en vertical, excepto al inicio que
		puede mover dos, o cuando conquista una pieza que mueve un casillero en 
		diagonal. Se incluyen los movimientos validos para blancas y negras."""
		m=[(1,0),(-1,0),(2,0),(-2,0),(1,1),(1,-1),(-1,1),(-1,-1)]		
		return m
